Unter Docker haben Container in der Regel eine dynamische IP in einem docker-internen Netzwerk. In einigen Fällen ist es jedoch sinnvoll, Container direkten Zugang zum LAN über eine eigene LAN-IP zu gewähren. Beispiele dafür sind dockerisierte VPN-Gateways, über die geroutet werden soll sowie Dienste, welche auf Layer 3 im Netzwerk ereichbar sein sollen.
Docker bietet mit MacVLAN einen Netwerktreiber, der ein solchen Setup ermöglicht. Eine Einschränkung ist jedoch, dass ein solches Netzwerk keine Kommunikation zwischen dem Host und den Containern zulässt – dies kann man jedoch recht einfach ändern.
MacVLAN Device auf dem Host einrichten
Der Grund, warum der Host nicht auf die Container im MacVLAN zugreifen kann ist, dass der Host die physikalische Netzwerkkarte direkt benutzt, die Container aber daran gebundene MacVLAN-Devices verwenden. Daher muss auch der Host ein MacVLAN device verwenden. Dieses wird, ganz ähnlich einer Bridge, anstatt dem Device der physikalischen Netzwerkkarte für die Netzwerkkonfiguration eingerichtet.
Unter Debian sieht die Konfiguration (für die physikalische Netzwerkkarte eno1) wie folgt aus:
auto eno1 iface eno1 inet manual auto macvlan0 iface macvlan0 inet static address 192.168.1.1 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 gateway 192.168.1.254 dns-nameservers 192.168.1.254 pre-up ip link add link eno1 name macvlan0 type macvlan mode bridge
Nach einem Reboot hat eno1 keine IP-Adresse mehr – diese ist stattdessen auf macvlan0 konfiguriert.
Docker Netzwerk erzeugen
docker network create \ --driver=macvlan \ --subnet=192.168.1.0/24 \ --gateway 192.168.1.254 \ -o parent=eno1 \ -o macvlan_mode=bridge \ macvlan0
Dies erzeugt ein Netzwerk mit dem Namen macvlan0 welches an eno1 gebunden ist. Zu beachten ist, dass jedem Container, der in diesem Netzwerk gestartet wird, eine feste IP zugeordnet wird. Ansonsten vergibt Docker wahllos IPs aus dem Bereich 192.168.1.0/24, welche ggf. mit bereits verwendeten IPs kollidieren.
Einzelne IPs kann man auch mit der Option –aux-address=“myexternalserver=192.168.1.123″ (ggf. auch mehrfach) ausschließen. Ebenso lassen sich mit der Option „–ip-range=192.168.1.199/32“ die automatischen IPs auf ein kleines Subnetz oder gar auf eine einzelne IP einschränken.
Docker Netzwerk testen
Der folgende Befehl erzeugt einen Container im MacVLAN-Netzwerk mit der festen IP-Adresse 192.168.1.211:
docker run -it --rm --net macvlan0 --ip 192.168.1.211 alpine
Vom Container aus sind der Host, das Gateway, externe Hosts sowie andere Container im MacVLAN-Netzwerk erreichbar.
Auch von einem Container im normalen docker0-Netzwerk aus sind der Host, das Gateway, externe Hosts sowie Container im MacVLAN-Netzwerk ereichbar:
docker run -it --rm alpine
In Docker-Compose verwenden
Das neue Netzwerk kann auch in docker-compose mit der folgenden Konfiguration verwendet werden:
service: test: image: alpine networks: macvlan0: ipv4_address: 192.168.1.212 restart: unless-stopped networks: macvlan0: external: name: macvlan0
Danke für den Tipp, jetzt funkt es bei mir auch mit Debian
Hallo. Vielen Dank für den Artikel. Hat mir sehr geholfen.